/**
 * @defgroup TestCollection 关于Java异常机制的例子
 * @author 李焕帅
 * @version 0.1
 * @date 04/08/2012
 * @{
 */
/**
 * @name 包定义
 * @{
 */
package indd.lihs.basic.javabasictester;

import java.util.*;
/** @}*/
// 包定义

/**
 * @name 测试类型定义
 * @{
 */
public class TestCollection
{
    /**
     * 主函数
     * @param[in] args 参数字符串数组
     * @return void
     * @note 某个方法可能抛出某种异常,但其中没有定义相应的捕获代码.这时如果抛出,\n
     *       则系统直接退出该方法,并将异常发回给调用者其中.
     */
    public static void main(String[] args)
    {
        Collection<Number> numbers = new ArrayList<Number>();
        Collection<Double> doubles = new ArrayList<Double>();
        Collection<Double> doubles1 = new ArrayList<Double>();

        // 向Collection类添加元素
        for (int i = 0; i < 6; i++)
            numbers.add(5 * i);
        System.out.println("numbers => " + numbers);
        doubles.add(2.6);
        doubles.add(3.4);
        System.out.println("doubles => " + doubles);

        // 由另一个集合添加
        numbers.addAll(doubles);
        System.out.println("numbers => " + numbers);
        System.out.println("doubles => " + doubles);

        // 判断元素存在,比较时依据类对象的equals方法
        System.out.println("numbers.contains(0) => " + numbers.contains(0));
        System.out.println("numbers.contains(5) => " + numbers.contains(5));
        System.out.println("numbers.contains(2.6f) => "
                        + numbers.contains(2.6f));
        System.out.println("numbers.contains(2.6) => " + numbers.contains(2.6));
        System.out.println("numbers.containsAll(doubles) => "
                        + numbers.containsAll(doubles));

        // 向ArrayList添加元素
        doubles1.add(3.4);
        doubles1.add(9.8);
        System.out.println("doubles => " + doubles);

        // 判断一个Collection所有元素在另一个Collection类的存在
        System.out.println("numbers.containsAll(doubles1) => "
                        + numbers.containsAll(doubles1));

        // 移除符合规格的元素,比较时依据equals,即两个对象是否为相同引用
        numbers.remove(1);
        numbers.remove(15);
        System.out.println("numbers => " + numbers);

        // 测试Collection类的toArray方法
        Object[] a1 = numbers.toArray();
        /**
         * @note if use 'Number[] a1 = numbers.toArray()', it will cause\n
         *       compiling error: Can not covert from Object[] to Number[]
         * @see <T> T[] java.util.Collection.toArray(T[] a)
         */
        System.out.println("a1 => " + Arrays.toString(a1));
        Number[] a2 = numbers.toArray(new Number[0]);
        System.out.println("a2 => " + Arrays.toString(a2));

        // 保持???
        numbers.retainAll(doubles);
        System.out.println("numbers => " + numbers);

        // 移除全部
        numbers.removeAll(doubles1);
        System.out.println("numbers => " + numbers);

        // 是否为空
        System.out.println("numbers is empty? " + numbers.isEmpty());

        // 清除???
        numbers.clear();
        System.out.println("numbers => " + numbers);

        // 是否为空
        System.out.println("numbers is empty? " + numbers.isEmpty());

        // 测试ArrayList的添加函数
        Collection<Num> nums = new ArrayList<Num>();
        nums.add(new Num(23));
        System.out.println("nums => " + nums);
    }
}

/** @}*/
// 测试类型定义

/**
 * @name 自定义数字类定义
 * @{
 */
/**
 * @belief 扩展的Java数字类
 */
class Num
{
    /** 数字值 */
    int num;

    /**
     * Num类的构造函数
     * @param[in] num 数值
     */
    public Num(int num)
    {
        this.num = num;
    }

    /**
     * 将数值转换为字符串
     * @param[in] void
     * @return String 对应的字符串
     * @see java.lang.Object#toString()
     */
    public String toString()
    {
        return Integer.toString(num);
    }
}

/** @}*/
// 自定义数字类定义

/** @}*/
// 模块定义
